#!/bin/bash

# 打包部署脚本 - 将代码打包以便部署到新服务器
# 使用方法: ./pack_deployment.sh

# 设置脚本参数
set -euo pipefail

# 配置变量
PROJECT_NAME="chatapp"
DEPLOY_DIR="/tmp/${PROJECT_NAME}_deployment"
OUTPUT_FILE="${PROJECT_NAME}_deployment_$(date +%Y%m%d_%H%M%S).tar.gz"
BACKEND_DIR="$(pwd)"
FRONTEND_DIR="$(dirname "$BACKEND_DIR")/frontend"
ROOT_DIR="$(dirname "$BACKEND_DIR")"

# 确保脚本在backend目录下执行
if [[ ! "$BACKEND_DIR" =~ "backend" ]]; then
    echo "❌ 请在项目的backend目录下执行此脚本"
    exit 1
fi

echo "🚀 开始打包${PROJECT_NAME}应用..."
echo "=================================="

# 清理旧的打包目录
if [ -d "$DEPLOY_DIR" ]; then
    echo "🧹 清理旧的打包目录: $DEPLOY_DIR"
    rm -rf "$DEPLOY_DIR"
fi

# 创建新的打包目录
echo "📁 创建打包目录: $DEPLOY_DIR"
mkdir -p "$DEPLOY_DIR"
mkdir -p "$DEPLOY_DIR/backend"
mkdir -p "$DEPLOY_DIR/instance"

# 复制必要的文件和目录
echo "📋 复制项目文件..."

# 复制backend目录下的文件，但排除不需要的内容
echo "   - 复制backend文件"
rsync -av "$BACKEND_DIR/" "$DEPLOY_DIR/backend/" \
    --exclude='__pycache__' \
    --exclude='*.pyc' \
    --exclude='*.pyo' \
    --exclude='*.pyd' \
    --exclude='.env' \
    --exclude='*.log' \
    --exclude='uploads/*' \
    --exclude='venv' \
    --exclude='myenv' \
    --exclude='.vscode' \
    --exclude='.idea' \
    --exclude='*.pid' \
    --exclude='*.seed' \
    --exclude='*.pid.lock' \
    --exclude='.git' \
    --exclude='.gitignore' \
    --exclude='pack_deployment.sh'

# 复制前端文件（如果存在）
if [ -d "$FRONTEND_DIR" ]; then
    echo "   - 复制frontend文件"
    mkdir -p "$DEPLOY_DIR/frontend"
    rsync -av "$FRONTEND_DIR/" "$DEPLOY_DIR/frontend/" \
        --exclude='__pycache__' \
        --exclude='node_modules' \
        --exclude='dist' \
        --exclude='build' \
        --exclude='.git' \
        --exclude='.gitignore'
else
    echo "   - 前端目录不存在，跳过"
fi

# 复制根目录下的重要文件
echo "   - 复制根目录文件"
cp -f "$ROOT_DIR/docker-compose.yml" "$DEPLOY_DIR/" 2>/dev/null || echo "   - docker-compose.yml不存在，跳过"
cp -f "$ROOT_DIR/README.md" "$DEPLOY_DIR/" 2>/dev/null || echo "   - README.md不存在，跳过"

# 创建.env.example文件（如果不存在）
if [ ! -f "$DEPLOY_DIR/backend/.env.example" ]; then
    echo "📝 创建.env.example文件"
    cat > "$DEPLOY_DIR/backend/.env.example" << EOF
# 应用配置
APP_ENV=production
APP_DEBUG=False
APP_SECRET_KEY=your-secret-key
PORT=5000

# 数据库配置
DATABASE_URL=postgresql://username:password@localhost:5432/chatapp
# 或使用SQLite（开发环境）
# DATABASE_URL=sqlite:///../instance/test.db

# JWT配置
JWT_SECRET_KEY=your-jwt-secret-key
JWT_ACCESS_TOKEN_EXPIRES=86400  # 24小时

# Redis配置
REDIS_URL=redis://localhost:6379/0

# CORS配置
CORS_ALLOWED_ORIGINS=https://your-domain.com

# SSL配置（可选）
# SSL_CERT=path/to/cert.pem
# SSL_KEY=path/to/key.pem
# SSL_CONTEXT=adhoc
EOF
fi

# 创建部署指南
echo "📖 创建部署指南"
cat > "$DEPLOY_DIR/DEPLOYMENT_GUIDE.md" << EOF
# ${PROJECT_NAME}部署指南

## 前提条件

在新服务器上需要安装以下软件:
- Docker
- Docker Compose
- Git (可选)
- curl
- bash

## 部署步骤

1. **复制部署包到目标服务器**
   ```bash
   scp ${OUTPUT_FILE} user@your-server:/path/to/destination
   ```

2. **登录到目标服务器**
   ```bash
   ssh user@your-server
   ```

3. **解压部署包**
   ```bash
   tar -xzf ${OUTPUT_FILE}
   cd ${PROJECT_NAME}_deployment
   ```

4. **配置环境变量**
   ```bash
   cd backend
   cp .env.example .env
   nano .env  # 编辑环境变量配置
   cd ..
   ```

5. **启动Docker容器**
   ```bash
   docker compose up -d --build
   ```

6. **检查服务状态**
   ```bash
   docker compose ps
   docker compose logs -f
   ```

7. **更新域名配置** (如果使用Cloudflare隧道)
   ```bash
   cd backend
   chmod +x renew_domain.sh restore_domain_cache.sh
   ./renew_domain.sh
   ```

## 常见问题排查

- **服务无法启动**: 检查.env配置和Docker日志
- **数据库连接错误**: 确保数据库配置正确且数据库服务正常
- **WebSocket连接问题**: 检查nginx配置和CORS设置
- **域名访问问题**: 运行renew_domain.sh脚本更新域名配置

## 维护命令

- 停止服务: `docker compose down`
- 重启服务: `docker compose restart`
- 查看日志: `docker compose logs [service_name]`
- 更新代码后重建: `docker compose up -d --build`
EOF

# 创建启动部署的辅助脚本
echo "🔧 创建辅助部署脚本"
cat > "$DEPLOY_DIR/deploy.sh" << EOF
#!/bin/bash

# 一键部署脚本

set -euo pipefail

# 配置环境变量
echo "🔧 配置环境变量..."
if [ ! -f "backend/.env" ]; then
    cp backend/.env.example backend/.env
    echo "⚠️  .env文件已创建，请先编辑配置，然后重新运行此脚本"
    echo "📝 编辑命令: nano backend/.env"
    exit 1
fi

# 启动Docker容器
echo "🚀 启动Docker容器..."
docker compose up -d --build

# 等待服务启动
echo "⏳ 等待服务启动..."
sleep 10

# 检查容器状态
echo "✅ 容器状态:"
docker compose ps

# 运行域名更新脚本
echo "🌐 更新域名配置..."
cd backend
chmod +x renew_domain.sh restore_domain_cache.sh
./renew_domain.sh
cd ..

# 显示部署完成信息
echo "🎉 部署完成！"
echo "📌 请访问脚本输出的域名查看应用"
echo "🔧 如需查看日志: docker compose logs -f"
EOF
chmod +x "$DEPLOY_DIR/deploy.sh"

# 压缩打包目录
echo "📦 压缩部署包..."
cd "$DEPLOY_DIR/.."
tar -czf "$OUTPUT_FILE" "$(basename "$DEPLOY_DIR")"

# 移动压缩包到当前目录
mv "$OUTPUT_FILE" "$BACKEND_DIR/"

# 清理临时目录
echo "🧹 清理临时文件..."
rm -rf "$DEPLOY_DIR"

# 显示完成信息
echo "✅ 打包完成！"
echo "=================================="
echo "输出文件: $BACKEND_DIR/$OUTPUT_FILE"
echo "部署指南: 请查看压缩包内的DEPLOYMENT_GUIDE.md"
echo "快速部署: 解压后运行deploy.sh脚本"
echo "=================================="